import { randInt } from "../random"

/**
 * 从 array 中随机获得 1 元素。
 * @param array
 */
export function sample(array: any[]): any {
  if (array == null || !array.length) return null
  const rnd = randInt(0, array.length)
  return array[rnd]
}

/**
 * 从 array 中随机获得 n 个元素（同一个元素不会获取两次）。
 * @param array
 * @example
 *
 * sampleN([1, 2, 3, 4], 2)
 * // => [ 3, 2 ]
 * sampleN([1, 2], 5)
 * // => [ 2, 1 ]
 */
export function sampleN(array: any[], n = 1): any[] {
  if (array == null || !array.length) return []
  n = Math.min(n, array.length)
  const arr = [...array]
  let endIndex = array.length - 1
  for (let i = n; i > 0; i--) {
    const rnd = randInt(0, endIndex)
    // 将 rnd 位置元素移至数组 (array.length - 1) + (n - i) 位置
    const tmp = arr[rnd]
    arr[rnd] = arr[endIndex]
    arr[endIndex] = tmp
    // console.log(`n = ${n}, rnd = ${rnd}, endIndex = ${endIndex}, arr = `,arr)
    endIndex--
  }
  return arr.slice(array.length - n)
}

/**
 * 从 array 中随机获得 n 个元素（同一个元素可以获取两次）。
 * @param array
 */
export function randomN(array: any[], n = 1): any[] {
  if (array == null || !array.length) return []
  n = Math.min(n, array.length)
  const result = []
  for (let i = n; i > 0; i--) {
    const rnd = randInt(0, array.length)
    result.push(array[rnd])
  }
  return result
}
